<?php
namespace Crud;

/**
 * @author Я
 * акшен который собстенно по конфиге выводит таблицу.
 *  этот класс является родителем для потомков.
 */
abstract class TableAction extends \Action {
	
	//тут мы говорим какую вызывать вьюху.
	protected static $defaultViews = ['#crud.table'];
	//определяем статик переменную конфига
	/**
	 * @var \Crud\CrudConfig
	 */
	protected static $_crudConfigClass;
	
	//дефолтное значение, оно переопределяется в конфиге
	const countOnPage = 10;

	function run( ) {

		$langId = $this->request->_langId;
		
		//Эти три параметра передаются из реквеста, собственно если у нас есть какой-то пейдж, либо установленна уже сортировка.
		$page = $this->request->page ?: 1;
		$sort = $this->request->sortType;		
		$sortField = $this->request->sortField;
		
		
		$params = $this->request->params();
		//
		//получаем наш конфиг который мы переопределили в потомке.
		$configName = static::$_crudConfigClass;
		$config = $configName::getTable();
		$finder = $configName::getFinder($params);
		$finder->withLang($langId);

		\Log::warn('', $params);
		
		//если поля нет, тогда сортируем по дефолтному.		
		if(isset($sortField) && !empty($sortField)){
			if(isset($config['sortField'])){
				$sortField = $config['sortField'];
			}
		}
		//если у нас указано поле сортировки, тогда сортируем
		if(isset($sortField) && !empty($sortField)){
			//тут выбираем как сортировать, по убыванию или по возрастанию.
			if($sort){
				$finder->orderReverse($sortField);
			}else{
				$finder->order($sortField);
			}
		}	
		
		$count = $finder->count();
		
		//собственно если есть в конфиге, тогда берем оттуда.
		if (isset($config['countOnPage'])) {
			$countOnPage = $config['countOnPage'];
		}
		
		$offset = ($page - 1) * $countOnPage;
		if($offset > 0){
			$finder->offset($offset);
		}
		
		//сюда будем помещать их айдишники, чтобы потом по ним пройтись и вызвать акшен отрисовки строки.		
		$arrId = array_keys($finder->limit($countOnPage)->column('_id'));
		
		//возвращаем наши строки.
		$this->response->header = $config['columns'];
		
		//возвращаем айдишники которые будем отдавать на отрисовку
		$this->response->arrId = $arrId;
		
		//это конфиг, его мы будем отвавать акшену для отрисовки строки.
		$this->response->conf = $configName;
		
		//количество строк для пагинатора
		$this->response->pages = (int)ceil($count / $countOnPage);
		
		//текущая строка
		$this->response->currentPage = $page;
		
		//текущий экшен
		$this->response->action = $this->request->action;
		
		//порядок сотрировки
		$this->response->sort = $sort;
		
		//поле сортировки 
		$this->response->sortField = $sortField;
		
		//прокидываем имя модели
		$this->response->className = $configName::get('model');
		
		//прокидываем параметры
		$this->response->params = $params;
	
	}
}